package com.szrt.day20161013;

import java.util.Scanner;

import org.junit.Test;

/**
 * 实现数组的增删改查
 * @author Administrator
 *
 */
public class ArrayCRUDDemo {
	
	
	@Test
	public void lesson01(){
		
		//静态初始化:  里面有多个个组长  并且每个组长是谁  适合于所有的元素都已知
		String[] leaders ={"关琛","郑智强","曹耿珲","所志松","曾瑶"};
		//String[] leaders =new String[]{"关琛","郑智强","曹耿珲","所志松","曾瑶"};
		System.out.println(leaders);
		
		//动态的初始化： 里面将有5个组长。每个组长  元素为止  但是个数知道
		String[] ls = new String[5];
		ls[0]="关琛";
		ls[1]="郑智强";
		ls[2]="曹耿珲";
		ls[3]="所志松";
		ls[4]="曾瑶";
		
		
		int   age=20;
		
		int xx = age;
		xx =222;
		System.out.println(xx);
		System.err.println(age);
		
		
		
		
		int[] ages= {22,27,23,31,27};
		
		int [] ages22 = ages;
		
		for(int a: ages22){
			System.out.println(a);
		}
		
		ages22[0]=10086;
		
		System.out.println(ages[0]); 
		
		
		//
		
		//数组  是所谓的引用类型   C语言  指针
		/*
		 * 总结：   
		 * 		基本类型  有且只有1块内存    栈内存  放在栈内存中： 优点运行速度快。大小固定 比如int 是4个字节
		 * 		引用类型  有2块内存   ages放在栈内存中  具体的值保存在堆内存中   ages保留的值可以快速地找到对内存中的元素
		 */
		
	}
	
	
	/**
	 * 测试数组的新增
	 */
	@Test
	public void crud01(){
		String[] leaders ={"关琛","郑智强","曹耿珲","所志松","曾瑶"/*,"张无忌"*/};
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入新增加的组长的名字....");
		String nl = sc.next();
		sc.close();
		
		String[] newLeders =add(leaders,nl);
		
		//方法调用
		printArray(newLeders);
		
	}
	
	
	/**
	 * String[] leaders = {"关琛","郑智强","曹耿珲","所志松","曾瑶"};  
	 * 删除1个人  scanner  曹耿珲 判断有才删除  没有直接提示该用户不存在 不能删除   
	 * 如果有：新作1个数组  "关琛","郑智强"  下标  不变   后面的下标-1   
	 * 新数组的长度是原来长度-1
	 */
	@Test
	public void delete(){   
							// [ '关琛' , '郑智强' , '所志松' , '曾瑶' ] 
		String[] leaders = {"关琛","郑智强","曹耿珲","所志松","曾瑶"};
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入新删除的组长的名字....");
		//deleteLeader 表示要被删除的组长
		String deleteLeader = sc.next();
		sc.close();
		
		// counter 用来判断数组中是否有这个人   1 表明有  0 表明没有
		int counter     = 0;
		
		//要删除的那个人的下标
		int searchIndex =-1;
		//曹耿珲 判断有才删除  没有直接提示该用户不存在
		for(int index=0; index<leaders.length;index++){
			
			//拿到某1个具体的组长
			String leader = leaders[index];
			
			if(leader.equals(deleteLeader)){
				searchIndex = index;
				
				//说明这个人存在
				counter = counter+1;
				
				//因为找到了这个用户 需要把这个用户的下标  放出来。
				break;
				
			}
		}
		
		if(counter == 1){
			
			/*
			 *  目的： 删除指定下标 searchIndex 的组长?
			 *  
			 *  答：  
			 *  	1：新作1个数组   新数组的长度是原来长度-1
			 *  	2：遍历老数组    
			 *  		2.1 如果下标小于 searchIndex     直接复制过去
			 *  		2.2 如果下标== searchIndex      就什么事情   continue
			 *  		2.3 如果下标大于 searchIndex      就下标减1
			 */
			
			//1：新作1个数组   新数组的长度是原来长度-1
			String[] newArray = new String[leaders.length-1];
			for(int index =0;index<leaders.length;index++){
				String leader = leaders[index];
				if(index<searchIndex){
					//2.1 如果下标小于 searchIndex     直接复制过去
					newArray[index]=leader;
				}else if(index==searchIndex){
					//2.2 如果下标== searchIndex     就什么事情   continue
					continue;
				}else{
					//2.3 如果下标大于 searchIndex     就下标减1
					newArray[index-1]=leader;
				}
			}
			
			printArray(newArray);
			
			
		}else{
			//说明这被删除的人deleteLeader不存在
			System.out.println("该组长["+deleteLeader+"]不存在。不能删除....");
		}
		
		
		
	}
	
	
	/**
	 * 华为：　圈复杂度   检查你的代码是否有大量的代码重复  1 2  5
	 * @param newLeders
	 */
	public void printArray(String[] newLeders){
		System.out.print("[ ");
		for(int index =0; index<newLeders.length;index++){
			String ld = newLeders[index];
			if(index != newLeders.length -1){
				System.out.print("'"+ld +"' , ");
			}else{
				System.out.print("'"+ld +"' ] ");
			}
		}
	}
	
	
	/**
	 * 测试数组的修改
	 */
	@Test
	public void crud02(){
						// [ '关琛' , '郑智强' , '张无忌' , '所志松' , '曾瑶' ] 
		String[] leaders = {"关琛","郑智强","曹耿珲","所志松","曾瑶"};
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入被修改的组长的姓名....");  //曹耿珲
		String leaderOld = sc.next();
		
		System.out.println("请输入被修改后的组长的的姓名....");  //张无忌
		String leaderNew = sc.next();
		
		sc.close();
		update(leaders, leaderOld, leaderNew);
		
		printArray(leaders);
		
		
		
		
	}
	
	
	/**
	 * 把 曹耿珲  修改成  张无忌
	 */
	public void update(String[] leaders,String updateOld,String updateNew){
		
		// 1 先要判断是否存在 曹耿珲 updateOld 如果存在 就修改  如果不存在 提示这个组长不存在
		
		boolean counter=false;  //小技巧
		
		//{"关琛","郑智强","曹耿珲","所志松","曾瑶"}
		for(int index =0; index<leaders.length;index++){
			String ld = leaders[index];
			if(updateOld.equals(ld) ){
				counter = true;
				leaders[index] = updateNew;
				System.out.println("修改成功....");
				break;
			}
		}
		
		System.out.println(counter);
		
		if(counter == false){
			//说明这个组长不存在
			System.out.println("组长["+updateOld+"]不存在....");
		}
		
		
		
	}
	
	
	
	public String[] add(String[] leaders,String nl){
		//需求：　新增　在　数组的末尾　增加1个组长 张无忌
		
		//问?   逻辑思路  数组一旦确定  就不能更改大小
		
		//1 找1间  5室1厅   要新建1个数组  new数组的长度= old数组的长度 +1
		int length = leaders.length;
		int newLenght = length + 1;
		String[] newLeader =new String[newLenght];
		
		
		//2 以前谁排在第1位  现在还是排在第1位     22 33  44  ??
		for(int index =0; index<length;index++){
			String leader = leaders[index];
			newLeader[index]= leader;
		}
		//3 新进来的人只能加在数组的末尾
		
		newLeader[newLeader.length-1]=nl;
		
		
		return newLeader;
		
		
	}
	
	
	@Test
	public void add01(){
						 //关琛 郑智强 曹耿珲 所志松 曾瑶 张无忌
		String[] leaders ={"关琛","郑智强","曹耿珲","所志松","曾瑶"/*,"张无忌"*/};
		
		//需求：　新增　在　数组的末尾　增加1个组长 张无忌
		
		//问?   逻辑思路  数组一旦确定  就不能更改大小
		
		//1 找1间  5室1厅   要新建1个数组  new数组的长度= old数组的长度 +1
		int length = leaders.length;
		int newLenght = length + 1;
		String[] newLeader =new String[newLenght];
		
		
		//2 以前谁排在第1位  现在还是排在第1位     22 33  44  ??
		for(int index =0; index<length;index++){
			String leader = leaders[index];
			newLeader[index]= leader;
		}
		//3 新进来的人只能加在数组的末尾
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入新增加的组长的名字....");
		String nl = sc.next();
		sc.close();
		newLeader[newLeader.length-1]=nl;
		
		System.out.println("新的组长们如下=======================");
		
		for(String ss : newLeader){
			System.out.print(ss + " ");
		}
		
	}
	

	@Test
	public void add02(){
		int[] oldA={22,27,23,27,31};
		int[] newA=new int[oldA.length+1];
		int len=newA.length; //6
		
		
		for(int i=0;i<len;i++){  //0
			if(i != len-1){
				newA[i]=oldA[i];
			}else{
				newA[i] =33;
			}
		}
		
		for (int i : newA) {
			System.out.println(i);
		}

	}
	
	

}
